#include <iostream>
#include <string>

using namespace std;

// 现在 你需要编辑一个电机控制程序  控制电机 x y
/*
编译 g++ -g 程序名

使用
    gdb ./a.out

    设置断点
    (gdb)b main
    (gdb)b Moto_func

    开始运行
    (gdb)r

    (gdb)n 单行运行

    (gdb)print x
    (gdb)print y

    n

    vtable 
*/

class Moto_ctrl
{
public:
    // 电机启动  // 纯虚函数
    virtual void Moto_start() = 0;
    // 电机停止
    virtual void Moto_stop() = 0;
};


class Moto_x: public Moto_ctrl
{
public:
// 函数重写
    // 电机启动
    void Moto_start()
    {
        cout << "x电机移动" << endl;
    }
    // 电机停止
    virtual void Moto_stop() {
        cout << "x电机停止" << endl;
    }
};


class Moto_y: public Moto_ctrl
{
public:
    // 电机启动
    void Moto_start()
    {
        cout << "y电机移动" << endl;
    }
    // 电机停止
    virtual void Moto_stop() {
        cout << "y电机停止" << endl;
    }
};

// 早绑定
void Moto_func(Moto_ctrl & M)
{
    M.Moto_start();
    M.Moto_stop();
}



int main(int argc, char const *argv[])
{
    
    Moto_x x;
    Moto_y y;

    Moto_func(x);
    Moto_func(y);

    
    return 0;
}

// 用虚类 地址一直在边
// 普通类型 地址不变
// $1 = {<Moto_ctrl> = {_vptr.Moto_ctrl = 0x555555557d38 <vtable for Moto_x+16>}, <No data fields>}

// $2 = {<Moto_ctrl> = {_vptr.Moto_ctrl = 0x555555557d18 <vtable for Moto_y+16>}, <No data fields>}


// $3 = (Moto_ctrl &) @0x7fffffffe118: {_vptr.Moto_ctrl = 0x555555557d38 <vtable for Moto_x+16>}



// $1 = {<Moto_ctrl> = {<No data fields>}, _vptr.Moto_x = 0x555555557d40 <vtable for Moto_x+16>}
// $2 = {<Moto_ctrl> = {<No data fields>}, _vptr.Moto_y = 0x555555557d28 <vtable for Moto_y+16>}

// $4 = (Moto_ctrl &) @0x7fffffffe118: {<No data fields>}


// _vptr.Moto_ctrl = 0x555555557d38 <vtable for Moto_x+16>
// _vptr.Moto_ctrl = 0x555555557d18 <vtable for Moto_y+16>


// Moto_ctrl = 0x555555557d38 <vtable for Moto_x+16>
// Moto_ctrl = 0x555555557d18 <vtable for Moto_y+16>

